/**
 * 中间件的分类
 * 1、应用级别的中间件
 * app.use()挂载的
 * 2、路由级别的中间件
 * express.router() 挂载的
 * 3、错误级别的中间件
 * 作用：专门用来补货整个项目中发生的异常错误，从而防止项目异常崩溃的问题
 * 函数格式为：有四个形参 function(err,req,res,next()){}  注意：错误级别的中间件必须注册在所有路由之后
 * 4、Express内置的中间件
 * express.static() 快速托管静态资源的内置中间件，例如HTML文件、图片、CSS样式等（无兼容）
 * express.json()  解析JSON格式的请求数据（有兼容性，4.16.0+
 * express.urlencoded() 解析URL-encoded格式请求的数据（有兼容性，4.16.0+
 * 使用：
 * app.use(express.json())   配置解析application/json格式数据的内置中间件
 * app.use(express.urleccoded({extended:false}))  配置解析application/x-www-form-urlencoded格式数据的内置中间件
 * 5、第三方的中间件
 * 第三方开发出来的中间件
 * 步骤：安装中间件，导入中间件、调用app.use()注册中间件
 */
const express = require('express')
const app = express();

// 配置解析json格式的body请求体
app.use(express.json())
// 配置解析form表单格式的请求体
app.use(express.urlencoded({extended:false}))

app.get('/err',(req,res)=>{
  // throw new Error('服务器崩溃了aaaaa')
  res.send('ok')
})

app.post('/getJsonData',(req,res)=>{
  // 默认情况下 req.body 返回的是undefind类型
  console.log(req.body)
  res.send(req.body)
})


app.post('/getFormBody',(req,res)=>{
  console.log('form表单格式的请求体',req.body)
  res.send(req.body)
})

//  错误级别的中间件要在所有路由之后注册
app.use((err,req,res,next)=>{
  res.send(err.message)
  next()
})
app.listen('80',()=>{
  console.log('服务器启动了  http://127.0.0.1/')
})

//  错误级别的中间件